package user

import user.Petiano;
import user.Tutor;
import user.UserService;


description """Teste de aceitação referente a US2.
			Cadastro e edição de usuários."""

before "cenários", {
	userService = new UserService();
}

// Cadastro

scenario "Requisitar cadastro de usuário com campos obrigatórios válidos", {
	
	given "um tutor com dados válidos", {
		tutor = new Tutor(nome:"João", sobrenome:"Aleixo", email:"joao@email.com", pseudonimo:"joao", senha:"12345", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), titulacao:"Ninja")
	}
	
	when "este requisitar ser cadastrado", {
		userService.save(tutor)
	}
	
	then "ele estará armazenado no sistema na lista de usuários", {
		resultado = userService.getTutor()
		resultado.nome.shouldBe tutor.nome
		resultado.sobrenome.shouldBe tutor.sobrenome
		resultado.email.shouldBe tutor.email
		resultado.pseudonimo.shouldBe tutor.pseudonimo
		resultado.ingresso.shouldBe tutor.ingresso
		resultado.titulacao.shouldBe tutor.titulacao
	}
	
	given "um petiano com dados válidos", {
		petiano = new Petiano(nome:"José", sobrenome:"Aleixo", email:"jose@email.com", pseudonimo:"jose", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:5)
	}
	
	when "este requisitar ser cadastrado", {
		userService.save(petiano)
	}
	
	then "ele estará armazenado no sistema na lista de usuários", {
		resultado = userService.getPetianoByEmail("jose@email.com")
		resultado.nome.shouldBe petiano.nome
		resultado.sobrenome.shouldBe petiano.sobrenome
		resultado.email.shouldBe petiano.email
		resultado.pseudonimo.shouldBe petiano.pseudonimo
		resultado.ingresso.shouldBe petiano.ingresso
		resultado.CRE.shouldBe petiano.CRE
		resultado.ehBolsista.shouldBe petiano.ehBolsista
		resultado.ehBolsista.shouldBe petiano.ehBolsista
		resultado.periodo.shouldBe petiano.periodo
	}
}

scenario "Requisitar cadastro de usuário sem todos os campos obrigatórios", {
	
	given "um tutor com dados obrigatórios incompletos", {
		tutor2 = new Tutor(sobrenome:"Aleixo", email:"joao@email.com", pseudonimo:"joao", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), titulacao:"Ninja")
		tutor3 = new Tutor(nome:"João", email:"joao@email.com", pseudonimo:"joao", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), titulacao:"Ninja")
		tutor4 = new Tutor(nome:"João", sobrenome:"Aleixo", pseudonimo:"joao", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), titulacao:"Ninja")
		tutor5 = new Tutor(nome:"João", sobrenome:"Aleixo", email:"joao@email.com", senha:"123456", titulacao:"Ninja")
		tutor6 = new Tutor(nome:"João", sobrenome:"Aleixo", email:"joao@email.com", pseudonimo:"joao", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"))
	}
	
	when "estes requisitarem serem cadastrados", {
		userService.save(tutor2)
		userService.save(tutor3)
		userService.save(tutor4)
		userService.save(tutor5)
		userService.save(tutor6)
	}
	
	then "ele não estarão armazenados no sistema", {
		resultado2 = userService.getNumberTutors()
		resultado2.shouldBe 2 // administrador + o do primeiro cenário
	}
	
	given "um petiano com dados obrigatórios incompletos", {
		petiano2 = new Petiano(sobrenome:"Aleixo", email:"jose@email.com", pseudonimo:"jose", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:5)
		petiano3 = new Petiano(nome:"José", email:"jose@email.com", pseudonimo:"jose", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:5)
		petiano4 = new Petiano(nome:"José", sobrenome:"Aleixo", pseudonimo:"jose", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:5)
		petiano5 = new Petiano(nome:"José", sobrenome:"Aleixo", email:"jose@email.com", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:5)
		petiano6 = new Petiano(nome:"José", sobrenome:"Aleixo", email:"jose@email.com", pseudonimo:"jose", CRE:8.05, ehBolsista:true, periodo:5)
		petiano7 = new Petiano(nome:"José", sobrenome:"Aleixo", email:"jose@email.com", pseudonimo:"jose", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), ehBolsista:true, periodo:5)
	}
	
	when "estes requisitarem serem cadastrados", {
		userService.save(petiano2)
		userService.save(petiano3)
		userService.save(petiano4)
		userService.save(petiano5)
		userService.save(petiano6)
		userService.save(petiano7)
	}
	
	then "ele não estarão armazenados no sistema", {
		resultado2 = userService.getNumberPetianos()
		resultado2.shouldBe 1 // apenas o do primeiro cenário
	}
	
}

scenario "Requisitar cadastro de usuário com dados inválidos", {

	given "um tutor com dados obrigatórios completos, porém alguns inválidos", {
		tutor7 = new Tutor(nome:"1", sobrenome:"Aleixo", email:"maria@email.com", pseudonimo:"maria", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), titulacao:"Ninja")
		tutor8 = new Tutor(nome:"Maria", sobrenome:"2", email:"", pseudonimo:"", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), titulacao:"Ninja")
		tutor9 = new Tutor(nome:"Maria", sobrenome:"Aleixo", email:"3", pseudonimo:"", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), titulacao:"Ninja")
		tutor10 = new Tutor(nome:"Maria", sobrenome:"Aleixo", email:"maria@email.com", pseudonimo:"4", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), titulacao:"Ninja")
		tutor11 = new Tutor(nome:"Maria", sobrenome:"Aleixo", email:"maria@email.com", pseudonimo:"maria", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2050"), titulacao:"Ninja")
		tutor12 = new Tutor(nome:"Maria", sobrenome:"Aleixo", email:"maria@email.com", pseudonimo:"maria", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), titulacao:"6")
	}
	
	when "este requisitar ser cadastrado", {
		userService.save(tutor7)
		userService.save(tutor8)
		userService.save(tutor9)
		userService.save(tutor10)
		userService.save(tutor11)
		userService.save(tutor12)
	}
	
	then "ele não estará armazenado no sistema", {
		resultado3 = userService.getNumberTutors()
		resultado3.shouldBe 2 // administrador + o do primeiro cenário
	}
	
	given "um petiano com dados obrigatórios completos, porém alguns inválidos", {
		petiano8 = new Petiano(nome:"1", sobrenome:"Aleixo", email:"maria@email.com", pseudonimo:"maria", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:5)
		petiano9 = new Petiano(nome:"Maria", sobrenome:"2", email:"maria@email.com", pseudonimo:"maria", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:5)
		petiano10 = new Petiano(nome:"Maria", sobrenome:"Aleixo", email:"3", pseudonimo:"maria", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:5)
		petiano11 = new Petiano(nome:"Maria", sobrenome:"Aleixo", email:"maria@email.com", pseudonimo:"4", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:5)
		petiano12 = new Petiano(nome:"Maria", sobrenome:"Aleixo", email:"maria@email.com", pseudonimo:"maria", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2050"), CRE:8.05, ehBolsista:true, periodo:5)
		petiano13 = new Petiano(nome:"Maria", sobrenome:"Aleixo", email:"maria@email.com", pseudonimo:"maria", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:11, ehBolsista:true, periodo:5)
		petiano14 = new Petiano(nome:"Maria", sobrenome:"Aleixo", email:"maria@email.com", pseudonimo:"maria", senha:"123456", ingresso:new Date().parse("d/M/yyyy","21/3/2008"), CRE:8.05, ehBolsista:true, periodo:16)
	}
	
	when "este requisitar ser cadastrado", {
		userService.save(petiano8)
		userService.save(petiano9)
		userService.save(petiano10)
		userService.save(petiano12)
		userService.save(petiano13)
		userService.save(petiano14)
	}
	
	then "ele não estará armazenado no sistema", {
		resultado3 = userService.getNumberPetianos()
		resultado3.shouldBe 1 // o do primeiro cenário
	}
}

// Edição

scenario "Requisitar edição de usuário com campos obrigatórios válidos", {
	
	given "um tutor com dados válidos", {
		tutor13 = userService.getTutor()
		tutor13.sobrenome = "Aleixo2"
		tutor13.email = "ronaldo@email.com"
		tutor13.titulacao = "Master Ninja"
	}
	
	when "este requisitar ser atualizado", {
		userService.save(tutor13)
	}
	
	then "as modificações não serão salvas no sistema", {
		resultado4 = userService.getTutor()
		resultado4.sobrenome.shouldBe tutor13.sobrenome
		resultado4.titulacao.shouldBe tutor13.titulacao
	}
	
	given "um petiano com dados válidos", {
		petiano15 = userService.getPetianoByEmail("jose@email.com")
		petiano15.sobrenome = "Aleixo2"
		petiano15.periodo = 7
	}
	
	when "este requisitar ser atualizado", {
		userService.save(petiano15)
	}
	
	then "as modificações não serão salvas no sistema", {
		resultado4 = userService.getPetianoById(petiano15.id)
		resultado4.sobrenome.shouldBe petiano15.sobrenome
		resultado4.periodo.shouldBe petiano15.periodo
	}
}

scenario "Requisitar edição de tutor não existente", {
	given "um id de petiano inexistente", {
		petianoNulo = userService.getPetianoById(35345)
	}
	
	when "este requisitar ser atualizado", {
		def updatePetiano = {
			petianoNulo.ehBolsista = false
		}
	}
	
	then "será lançado uma exceção, e consequentemente não está armazenado no sistema", {
		ensureThrows(Exception) {
			updatePetiano()
	    }
	}
}

scenario "Requisitar edição de tutor sem todos os campos obrigatórios", {
	given "um tutor com novos dados obrigatórios incompletos", {
		tutor14 = userService.getTutor()
		tutor14.nome = null
	}
	
	when "este requisitar salvar seus novos dados", {
		resultado5 = userService.save(tutor14)
	}
	
	then "as modificações não serão salvas no sistema", {
		ensure(resultado5) {
			isNull
		}
	}
	
	given "um petiano com novos dados obrigatórios incompletos", {
		petiano16 = userService.getPetianoByEmail("jose@email.com")
		petiano16.nome = null
	}
	
	when "este requisitar salvar seus novos dados", {
		resultado5 = userService.save(petiano16)
	}
	
	then "as modificações não serão salvas no sistema", {
		ensure(resultado5) {
			isNull
		}
	}
}

scenario "Requisitar edição de tutor com dados inválidos", {
	given "um tutor com dados obrigatórios completos, porém algum inválido", {
		tutor15 = userService.getTutor()
		tutor15.nome = "1"
	}
	
	when "este requisitar salvar novos dados", {
		resultado6 = userService.save(tutor15)
	}
	
	then "as modificação não será salva no sistema", {
		ensure(resultado6) {
			isNull
		}
	}
	
	given "um petiano com dados obrigatórios completos, porém algum inválido", {
		petiano17 = userService.getPetianoByEmail("jose@email.com")
		petiano17.nome = "1"
	}
	
	when "este requisitar salvar novos dados", {
		resultado6 = userService.save(tutor15)
	}
	
	then "a modificação não será salva no sistema", {
		ensure(resultado6) {
			isNull
		}
	}
}																	